/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Usuarios;


import Utilidades.imagenUtils;
import Utilidades.utils;
import java.awt.*;
import java.awt.event.*;
import java.sql.SQLException;
import java.util.Vector;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.*;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;
import javax.swing.table.TableRowSorter;

/**
 *
 * @author alrojas
 */
public final class guiPrincipalUsuarios extends JFrame{

    private static guiPrincipalUsuarios identidad;
    private static guiPrincipalUsuarios instancia;
    private JFrame padre;
    private cUsuario    usuario;
    private JLabel      lBuscar;
    private JTextField  tBuscar;
    private JLabel   foto;
    private JTable      listaTab;
    private TableRowSorter<TableModel> clasificador;
    private JButton     agregarBut;
    private JButton     editarBut;
    private JButton     eliminarBut;
    private GridBagConstraints limites;
        
    
    private guiPrincipalUsuarios(JFrame padre) throws HeadlessException {
        
            identidad=this;
            this.padre=padre;
            this.setLayout(new GridBagLayout());
            this.setTitle("Usuarios");
            inicializarComponentes();
            inicializarListeners();
            this.pack();
            this.setLocationRelativeTo(null);
            this.setResizable(false);
            this.setVisible(true);
            
        
    }
    
    public static guiPrincipalUsuarios obtenerInstancia(JFrame padre){
        
        if(instancia==null){
            instancia=new guiPrincipalUsuarios(padre);
            return instancia;
        }
        utils.mostrarVentana(identidad);
        return instancia;

    }
    
    public void inicializarComponentes(){
             
            try {
                limites = new GridBagConstraints();
                usuario = new cUsuario();
                

                lBuscar = new JLabel("Buscar Usuario (Alt + B)"); lBuscar.setDisplayedMnemonic('B'); 
                lBuscar.setFont(new java.awt.Font("Arial", 1, 17));
                limites.gridx = 0; limites.gridy =0;
                limites.gridwidth=1;limites.gridheight=1;
                limites.insets = new Insets(50, 60, 2, 2);
                add(lBuscar,limites);

                tBuscar =  new JTextField(40); lBuscar.setLabelFor(tBuscar);
                tBuscar.setFont(new java.awt.Font("Arial", 0, 15));
                limites.gridx = 0; limites.gridy = 1;
                limites.gridwidth=3;
                limites.insets = new Insets(10, 70, 2, 2);
                add(tBuscar,limites);
            
                agregarBut = new JButton("Nuevo  (Ctrl + N)", new ImageIcon("figuras/add32.png"));
                agregarBut.setHorizontalTextPosition(SwingConstants.CENTER);
                agregarBut.setVerticalTextPosition(SwingConstants.BOTTOM) ;
                agregarBut.setVerticalAlignment(SwingConstants.CENTER);
                limites.gridx = 0; limites.gridy = 2;
                limites.gridheight=1;limites.gridwidth=1;
                limites.insets = new Insets(2, 60, 2, 2);
                add(agregarBut,limites);

                editarBut = new JButton("Editar (Ctrl + D)", new ImageIcon("figuras/edit32.png"));
                editarBut.setHorizontalTextPosition(SwingConstants.CENTER);
                editarBut.setVerticalTextPosition(SwingConstants.BOTTOM) ;
                editarBut.setVerticalAlignment(SwingConstants.CENTER); 
                limites.gridx = 1; limites.gridy = 2;
                limites.insets = new Insets(2, 2, 2, 2);
                add(editarBut,limites);

                eliminarBut = new JButton("Eliminar (Ctrl + E)", new ImageIcon("figuras/delete32.png"));
                eliminarBut.setHorizontalTextPosition(SwingConstants.CENTER);
                eliminarBut.setVerticalTextPosition(SwingConstants.BOTTOM) ;
                eliminarBut.setVerticalAlignment(SwingConstants.CENTER); 
                limites.gridx = 2; limites.gridy = 2;
                add(eliminarBut,limites);

                limites.insets = new Insets(2, 10, 2, 0);

                
                
                
                
                foto=new JLabel(new ImageIcon("./fotosUsuarios/foto.png"));
                limites.gridx = 3; limites.gridy = 0;
                limites.gridheight=3;limites.gridwidth=1;
                foto.setBorder(BorderFactory.createEmptyBorder(20,20,20,20));
                foto.setPreferredSize(new Dimension(250, 200)); 
                add(foto,limites);
                
                Vector<String> columnNames = new Vector<String>(); columnNames.add("Cod."); 
                                                columnNames.add("DNI"); 
                                                columnNames.add("Pri.Nombre"); 
                                                columnNames.add("Seg.Nombre"); 
                                                columnNames.add("P.Apellido");
                                                columnNames.add("S.Apellido");
                                                columnNames.add("Tipo");
                                                columnNames.add("Usuario");


                Vector <Vector<String>> usuarios = usuario.seleccionarTodo();
                //DefaultTableModel modelo = new DefaultTableModel(columnNames,0);
                DefaultTableModel modelo = new DefaultTableModel(usuarios,columnNames){
                    @Override
                    public boolean isCellEditable (int row, int column)
                    {
                        return false;
                    }
                };

                limites.insets = new Insets(2, 2, 2, 2);
                this.clasificador = new TableRowSorter<TableModel>(modelo);
                listaTab = new JTable(modelo); listaTab.setRowSorter(clasificador); listaTab.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
                listaTab.setRowHeight(25);
                listaTab.setFont(new java.awt.Font("Arial", 0, 17)); 
                limites.gridx = 0; limites.gridy = 3; limites.gridwidth = 4; limites.gridheight = 1;
                JScrollPane barras = new JScrollPane(listaTab); barras.setPreferredSize(new Dimension(1000, 250));
                add(barras,limites);
                
                listaTab.getColumn("Cod.").setPreferredWidth(3);

            } catch (SQLException ex) {
                Logger.getLogger(guiPrincipalUsuarios.class.getName()).log(Level.SEVERE, null, ex);
            } catch (ClassNotFoundException ex) {
                Logger.getLogger(guiPrincipalUsuarios.class.getName()).log(Level.SEVERE, null, ex);
            }
              
       
}

    
    public void inicializarListeners(){
        
       
        //FILTRO DE LA TABLA
        tBuscar.getDocument().addDocumentListener(
            new DocumentListener() {
                public void changedUpdate(DocumentEvent e) {
                    filtrar();
                }
                public void insertUpdate(DocumentEvent e) {
                    filtrar();
                }
                public void removeUpdate(DocumentEvent e) {
                    filtrar();
                }
        });
       
        //PARA LA VENTANA
        
        setDefaultCloseOperation(DO_NOTHING_ON_CLOSE); 
        
        this.addWindowListener(new WindowAdapter(){ 
          
            public void windowClosing(WindowEvent e) { 
                
                utils.ocultarVentana(identidad);
                utils.mostrarVentana(padre);
            } 

        }); 
        Action actEsc = new AbstractAction() { public void actionPerformed(ActionEvent e) {
            utils.ocultarVentana(identidad);
            utils.mostrarVentana(padre);
        
        }};
        foto.getInputMap(foto.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke("ESCAPE"),"accion");
        foto.getActionMap().put("accion", actEsc);
        
        
        //ACCION PARA EL BOTON AGREGAR
         Action actAgregar = new AbstractAction() {    
      
         public void actionPerformed(ActionEvent e) {agregarBut.doClick();}
          };
         
         agregarBut.addActionListener(new ActionListener() {

            
            public void actionPerformed(ActionEvent e) {
                guiAgregarUsuario.obtenerInstancia(identidad);
             }
        });
        
         agregarBut.getInputMap(agregarBut.WHEN_IN_FOCUSED_WINDOW).
                 put(KeyStroke.getKeyStroke(KeyEvent.VK_N,InputEvent.CTRL_MASK),"accion");
         agregarBut.getActionMap().put("accion", actAgregar);
        
        
         //ACCION PARA EL BOTON EDITAR
         
        Action actEditar = new AbstractAction() {    
      
         public void actionPerformed(ActionEvent e) {editarBut.doClick();}
          };
         
         editarBut.addActionListener(new ActionListener() {

            
            public void actionPerformed(ActionEvent e) {
                
             try {
                       usuario = new cUsuario(Integer.parseInt(listaTab.getValueAt(listaTab.getSelectedRow(),0).toString()),
                       listaTab.getValueAt(listaTab.getSelectedRow(),1).toString(),                 
                       listaTab.getValueAt(listaTab.getSelectedRow(),2).toString(),
                       listaTab.getValueAt(listaTab.getSelectedRow(),3).toString(),
                       listaTab.getValueAt(listaTab.getSelectedRow(),4).toString(),
                       listaTab.getValueAt(listaTab.getSelectedRow(),5).toString(),
                       null,
                       listaTab.getValueAt(listaTab.getSelectedRow(),7).toString(),
                       null);
               
                
                    guiEditarUsuario.obtenerInstancia(identidad, usuario);
                    
                } catch (IndexOutOfBoundsException ex) {
                    JOptionPane.showMessageDialog(null,"Selecciona un Usuario a Editar","Atención!!!",JOptionPane.INFORMATION_MESSAGE);
                }
               
               
               
                
             }
        });
        
         editarBut.getInputMap(editarBut.WHEN_IN_FOCUSED_WINDOW).
                 put(KeyStroke.getKeyStroke(KeyEvent.VK_D,InputEvent.CTRL_MASK),"accion");
         editarBut.getActionMap().put("accion", actEditar);
         
         //ACCION PARA EL BOTON ELIMINAR
         
         
         Action actEliminar = new AbstractAction() {    
      
         public void actionPerformed(ActionEvent e) {eliminarBut.doClick();}
          };
         
         eliminarBut.addActionListener(new ActionListener() {

            
            public void actionPerformed(ActionEvent e) {
                 try {
                    int confirmado = JOptionPane.showConfirmDialog(null,"Seguro que desea eliminar al usuario: " + listaTab.getValueAt(listaTab.getSelectedRow(),6).toString() + "?");

                     if (JOptionPane.OK_OPTION == confirmado){
                        boolean resultado = usuario.eliminar(Integer.parseInt(listaTab.getValueAt(listaTab.getSelectedRow(),0).toString()));
                        boolean resultadoImagen=
                                ((imagenUtils.eliminarFoto("./fotosUsuarios/", listaTab.getValueAt(listaTab.getSelectedRow(),1).toString()+"U"))
                                || !(imagenUtils.existeImagen("./fotosUsuarios/", listaTab.getValueAt(listaTab.getSelectedRow(),1).toString()+"U")));
                            if (resultado == true && resultadoImagen == true){
                            JOptionPane.showMessageDialog(null,"Usuario eliminado correctamente!","En Hora Buena!!!",JOptionPane.INFORMATION_MESSAGE);    
                                actualizarData();
                            }
                            else{JOptionPane.showMessageDialog(null,"No se realizó Ningún Cambio!","Error!",JOptionPane.ERROR_MESSAGE);}
                     }
                     else{
                     JOptionPane.showMessageDialog(null,"No se realizó Ningún Cambio!","Advertencia!",JOptionPane.WARNING_MESSAGE);
                     }
                     
                         
                } catch (SQLException ex) {
                    Logger.getLogger(guiPrincipalUsuarios.class.getName()).log(Level.SEVERE, null, ex);
                    JOptionPane.showMessageDialog(null,"Error de la Base de Datos!","Error Letal!!!",JOptionPane.ERROR_MESSAGE);
                } catch (ClassNotFoundException ex) {
                    Logger.getLogger(guiPrincipalUsuarios.class.getName()).log(Level.SEVERE, null, ex);
                    JOptionPane.showMessageDialog(null,"Error de la Base de Datos!","Error Letal!!!",JOptionPane.ERROR_MESSAGE);
                }catch (IndexOutOfBoundsException exe) {
                    JOptionPane.showMessageDialog(null,"Selecciona un Usuario a Eliminar","Atención!!!",JOptionPane.INFORMATION_MESSAGE);
                }
            }
        });
        
         eliminarBut.getInputMap(eliminarBut.WHEN_IN_FOCUSED_WINDOW).
                 put(KeyStroke.getKeyStroke(KeyEvent.VK_E,InputEvent.CTRL_MASK),"accion");
         eliminarBut.getActionMap().put("accion", actEliminar);
         
     
          //ACCION PARA LA TABLA
         
         listaTab.addMouseListener(new MouseAdapter() {
         public void mouseClicked(MouseEvent e) {
             if (e.getClickCount() == 1) {
                 
                 actualizarFoto(listaTab.getValueAt(listaTab.getSelectedRow(),1).toString());
                  
                     }
                 }
            });
    
    }
    
    private void filtrar() {
        RowFilter<TableModel, Object> rf = null;
        try {
            rf = RowFilter.regexFilter(tBuscar.getText());
        } catch (java.util.regex.PatternSyntaxException e) {
            return;
        }
        clasificador.setRowFilter(rf);
    }
    
    public void actualizarData() throws SQLException, ClassNotFoundException{
            
            Vector<String> columnNames = new Vector<String>(); columnNames.add("Cód."); 
                                               columnNames.add("DNI"); 
                                               columnNames.add("P.Nombre"); 
                                               columnNames.add("S.Nombre"); 
                                               columnNames.add("P.Apellido");
                                               columnNames.add("S.Apellido");
                                               columnNames.add("Tipo");
                                               columnNames.add("Usuario");
                                               
            Vector <Vector<String>> data = cUsuario.seleccionarTodo();

            DefaultTableModel modelo = new DefaultTableModel(data,columnNames);
            
            clasificador = new TableRowSorter<TableModel>(modelo);
            listaTab.setModel(modelo); listaTab.setRowSorter(clasificador); listaTab.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
            
    }
    
    public void actualizarFoto(final String imagen){
        
        if(imagenUtils.existeImagen("./fotosUsuarios/",imagen+"U")){
        foto.setIcon(new ImageIcon("./fotosUsuarios/"+imagen+"U.png"));
              identidad.pack();}
        else{foto.setIcon(new ImageIcon("./fotosUsuarios/foto.png"));
              identidad.pack();}
       
    }


}
